--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXST/Utilities/rnphone.py 0b2aa96cdaab4d1f04e2dfd8dc54b8305f4cc0b5 (0b2aa96c) Text, 33.43 KB
T8b949e#!/usr/bin/env python3
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787signal
Tff7b72import T7ee787threading
Tff7b72import T7ee787argparse
Tff7b72from T7ee787LXSTT7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787Telephony Tff7b72import Te6edf3Telephone
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72class T56d364ReticulumTelephoneTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3STATE_AVAILABLE Tff7b72= T79c0ff0x00
Te6edf3STATE_CONNECTING Tff7b72= T79c0ff0x01
Te6edf3STATE_RINGING Tff7b72= T79c0ff0x02
Te6edf3STATE_IN_CALL Tff7b72= T79c0ff0x03
Te6edf3HW_SLEEP_TIMEOUT Tff7b72= T79c0ff15
Te6edf3HW_STATE_IDLE Tff7b72= T79c0ff0x00
Te6edf3HW_STATE_DIAL Tff7b72= T79c0ff0x01
Te6edf3HW_STATE_SLEEP Tff7b72= T79c0ff0xFF
Te6edf3KPD_NUMBERS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff4Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff5Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff6Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff7Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff8Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff9Ta5d6ff"Tb4b4b4]
Te6edf3KPD_HEX_ALPHA Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffATa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffBTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffCTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffDTa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffETa5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ffFTa5d6ff"Tb4b4b4]
Te6edf3KPD_SYMBOLS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff*Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6ff#Ta5d6ff"Tb4b4b4]
Te6edf3RING_TIME Tff7b72= T79c0ff30
Te6edf3WAIT_TIME Tff7b72= T79c0ff60
Te6edf3PATH_TIME Tff7b72= T79c0ff10
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configdirTb4b4b4, Te6edf3rnsconfigdirTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3service Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffservice Tff7b72= Te6edf3service
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3configdir
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATE_AVAILABLE
Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tff7b72selfTff7b72.Td2a8ffhw_last_event Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflast_input Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffirst_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffringtone_path Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffspeaker_device Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmicrophone_device Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffringer_device Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffkeypad Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdisplay Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffallowed Tff7b72= Te6edf3TelephoneTff7b72.Td2a8ffALLOW_ALL
Tff7b72selfTff7b72.Td2a8ffallow_phonebook Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffallowed_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffblocked_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffphonebook Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffaliases Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffnames Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffreload_configTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmain_menuTb4b4b4(Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3rnsconfigdirTb4b4b4, Te6edf3loglevelTff7b72=T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72= Te6edf3TelephoneTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3ring_timeTff7b72=Tff7b72selfTff7b72.Td2a8ffring_timeTb4b4b4, Te6edf3wait_timeTff7b72=Tff7b72selfTff7b72.Td2a8ffwait_timeTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ringtoneTb4b4b4(Tff7b72selfTff7b72.Td2a8ffringtone_pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ringing_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffringingTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcall_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ended_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcall_endedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_speakerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffspeaker_deviceTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_microphoneTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmicrophone_deviceTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ringerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffringer_deviceTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_allowedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffallowedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_blockedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblocked_listTb4b4b4)
Tff7b72def Td2a8ffcreate_default_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3rnphone_config Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_rnphone_config__Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3rnphone_configTff7b72.Td2a8fffilename Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigpath
Te6edf3rnphone_configTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffreload_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoading configuration...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/rnphoneTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/rnphone/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/rnphoneTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/rnphoneTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/rnphone/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.config/rnphoneTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffuserdirTff7b72+Ta5d6ff"Ta5d6ff/.rnphoneTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconfigpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffignoredpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/ignoredTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffallowedpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/allowedTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentitypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/identityTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffstoragedir Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffring_time Tff7b72= Te6edf3ReticulumTelephoneTff7b72.Td2a8ffRING_TIME
Tff7b72selfTff7b72.Td2a8ffwait_time Tff7b72= Te6edf3ReticulumTelephoneTff7b72.Td2a8ffWAIT_TIME
Tff7b72selfTff7b72.Td2a8ffpath_time Tff7b72= Te6edf3ReticulumTelephoneTff7b72.Td2a8ffPATH_TIME
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragedirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragedirTb4b4b4)
Te6edf3ringer_tones Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffringer.opusTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsoft.opusTa5d6ff"Tb4b4b4]
Te6edf3sounds_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72__file__Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffSoundsTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3sounds_pathTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787shutil
Tff7b72for Te6edf3filename Tff7b72in Te6edf3ringer_tonesTb4b4b4:
Te6edf3src_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3sounds_pathTb4b4b4, Te6edf3filenameTb4b4b4)
Te6edf3dst_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3src_pathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCopying Tffd700{Te6edf3src_pathTffd700}Ta5d6ff to Tffd700{Te6edf3dst_pathTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3shutilTff7b72.Td2a8ffcopyTb4b4b4(Te6edf3src_pathTb4b4b4, Te6edf3dst_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcreate_default_configTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffirst_run Tff7b72= Tff7b72True
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
T8b949e# Generate or load primary identity
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo primary identity file found, creating new...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCreated new Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new Primary IdentityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapply_configTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__is_allowedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_listTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tff7b72def Td2a8ffload_phonebookTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3phonebookTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoading phonebook...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Te6edf3phonebookTb4b4b4:
Te6edf3alias Tff7b72= Tff7b72None
Te6edf3identity_hash Tff7b72= Te6edf3phonebookTb4b4b4[Te6edf3nameTb4b4b4]
Tff7b72if Tffa657typeTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Te6edf3components Tff7b72= Te6edf3identity_hash
Te6edf3identity_hash Tff7b72= Te6edf3componentsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3alias_input Tff7b72= Te6edf3componentsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3alias Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3c Tff7b72in Te6edf3alias_inputTb4b4b4:
Tff7b72if Te6edf3c Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff4Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff5Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff6Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff7Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff8Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff9Ta5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3alias Tff7b72+Tff7b72= Te6edf3c
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aliasTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Te6edf3alias Tff7b72= Tff7b72None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72= Te6edf3identity_hash
Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3name
Tff7b72if Te6edf3aliasTb4b4b4: Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3identity_hashTb4b4b4] Tff7b72= Te6edf3alias
Tff7b72if Tff7b72selfTff7b72.Td2a8ffallow_phonebookTb4b4b4: Tff7b72selfTff7b72.Td2a8ffallowed_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hash_bytesTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load phonebook entry for Tffd700{Te6edf3nameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffapply_configTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6fftelephoneTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3config Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftelephoneTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffringtoneTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffringtone_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4, Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffringtoneTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffspeakerTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffspeaker_device Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffspeakerTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffmicrophoneTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmicrophone_device Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffmicrophoneTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffringerTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffringer_device Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffringerTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffallowed_callersTa5d6ff" Tff7b72in Te6edf3configTb4b4b4:
Te6edf3allowed_callers Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffallowed_callersTa5d6ff"Tb4b4b4]
Tff7b72if Tffa657strTb4b4b4(Te6edf3allowed_callersTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffallTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffallowed Tff7b72= Te6edf3TelephoneTff7b72.Td2a8ffALLOW_ALL
Tff7b72elif Tffa657strTb4b4b4(Te6edf3allowed_callersTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffallowed Tff7b72= Te6edf3TelephoneTff7b72.Td2a8ffALLOW_NONE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3allowed_callersTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffphonebookTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallow_phonebook Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffallowed Tff7b72= Tff7b72selfTff7b72.Td2a8ff__is_allowed
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffallowed_callersTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed Tff7b72= Tff7b72selfTff7b72.Td2a8ff__is_allowed
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffallowed_callersTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load allowed caller entry Tffd700{Te6edf3identity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffallowed_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hash_bytesTb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffblocked_callersTa5d6ff" Tff7b72in Te6edf3configTb4b4b4:
Te6edf3blocked_callers Tff7b72= Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffblocked_callersTa5d6ff"Tb4b4b4]
Tff7b72if Tff7b72not Tffa657typeTb4b4b4(Te6edf3blocked_callersTb4b4b4) Tff7b72== Tffa657listTb4b4b4: Te6edf3blocked_callers Tff7b72= Tb4b4b4[Te6edf3blocked_callersTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3blocked_callersTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3identity_hash Tff7b72in Te6edf3blocked_callersTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3identity_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3identity_hash Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3hash_bytes Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load blocked caller entry Tffd700{Te6edf3identity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffblocked_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hash_bytesTb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffphonebookTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffload_phonebookTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffphonebookTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffhardwareTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3config Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffhardwareTa5d6ff"Tb4b4b4]
Tff7b72if Ta5d6ff"Ta5d6ffkeypadTa5d6ff" Tff7b72in Te6edf3configTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_keypadTb4b4b4(Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffkeypadTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffkeypad_hook_pinTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffenable_hookTb4b4b4(Te6edf3pin Tff7b72= Te6edf3configTff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffkeypad_hook_pinTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffdisplayTa5d6ff" Tff7b72in Te6edf3configTb4b4b4: Tff7b72selfTff7b72.Td2a8ffenable_displayTb4b4b4(Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffdisplayTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_dialled_identity_hash Tff7b72= Tff7b72None
Tff7b72def Td2a8ffenable_keypadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3driverTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStarting keypad: Tffd700{Te6edf3driverTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3driver Tff7b72== Ta5d6ff"Ta5d6ffgpio_4x4Ta5d6ff"Tb4b4b4:
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787hardwareT7ee787.T7ee787keypad_gpio_4x4 Tff7b72import Te6edf3Keypad
Tff7b72selfTff7b72.Td2a8ffkeypad Tff7b72= Te6edf3KeypadTb4b4b4(Te6edf3callbackTff7b72=Tff7b72selfTff7b72.Td2a8ff_keypad_eventTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnknown keypad driver specifiedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffenable_hookTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pinTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffkeypadTb4b4b4: Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffenable_hookTb4b4b4(Te6edf3pinTff7b72=Te6edf3pinTb4b4b4)
Tff7b72def Td2a8ffenable_displayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3driverTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStarting display: Tffd700{Te6edf3driverTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplay Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3driver Tff7b72== Ta5d6ff"Ta5d6ffi2c_lcd1602Ta5d6ff"Tb4b4b4:
Tff7b72from T7ee787LXSTT7ee787.T7ee787PrimitivesT7ee787.T7ee787hardwareT7ee787.T7ee787display_i2c_lcd1602 Tff7b72import Te6edf3LCD
Tff7b72selfTff7b72.Td2a8ffdisplay Tff7b72= Te6edf3LCDTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffUnknown display driver specifiedTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_display_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffis_availableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTATE_AVAILABLE
Tf0883e@property
Tff7b72def Td2a8ffis_in_callTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTATE_IN_CALL
Tf0883e@property
Tff7b72def Td2a8ffis_ringingTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTATE_RINGING
Tf0883e@property
Tff7b72def Td2a8ffcall_is_connectingTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTATE_CONNECTING
Tf0883e@property
Tff7b72def Td2a8ffhw_is_idleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72== Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tf0883e@property
Tff7b72def Td2a8ffhw_is_dialingTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72== Tff7b72selfTff7b72.Td2a8ffHW_STATE_DIAL
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3signalTff7b72.Td2a8ffsignalTb4b4b4(Te6edf3signalTff7b72.Td2a8ffSIGINTTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsigint_handlerTb4b4b4)
Te6edf3signalTff7b72.Td2a8ffsignalTb4b4b4(Te6edf3signalTff7b72.Td2a8ffSIGTERMTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsigterm_handlerTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72def Td2a8ffdialTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_hashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflast_dialled_identity_hash Tff7b72= Te6edf3identity_hash
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_busyTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3identity_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3identity_hashTb4b4b4)
Te6edf3destination_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffhash_from_name_and_identityTb4b4b4(Ta5d6ff"Ta5d6fflxst.telephonyTa5d6ff"Tb4b4b4, Te6edf3identity_hashTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6ffFinding path...Ta5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffspincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__spinTb4b4b4(Te6edf3spincheckTb4b4b4, Ta5d6ff"Ta5d6ffRequesting path for call to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffpath_timeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3spincheckTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath request timed outTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6ffFinding pathTa5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6fftimed outTa5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.5Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_busyTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3call_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3cs Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Te6edf3call_hops Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConnecting call over Tffd700{Te6edf3call_hopsTffd700}Ta5d6ff hopTffd700{Te6edf3csTffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Te6edf3call_hops_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3call_hopsTffd700}Ta5d6ffhTffd700{Te6edf3csTffd700}Ta5d6ff)Ta5d6ff"
Te6edf3call_str Tff7b72= Ta5d6ff"Ta5d6ffCallingTa5d6ff"Tb4b4b4; Te6edf3ns Tff7b72= Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffCOLSTff7b72-Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3call_strTb4b4b4)Tff7b72+Tffa657lenTb4b4b4(Te6edf3call_hops_strTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3s Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Te6edf3ns
Te6edf3disp_str Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3call_strTffd700}Tffd700{Te6edf3sTffd700}Tffd700{Te6edf3call_hops_strTffd700}Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Te6edf3disp_strTb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcallTb4b4b4(Te6edf3identityTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffredialTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflast_dialled_identity_hashTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdialTb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_dialled_identity_hashTb4b4b4)
Tff7b72def Td2a8ffcallTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCalling Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3remote_identityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATE_CONNECTING
Tff7b72selfTff7b72.Td2a8ffcaller Tff7b72= Te6edf3remote_identity
Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72= Ta5d6ff"Ta5d6fftoTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcallTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTb4b4b4)
Tff7b72def Td2a8ffringingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72== Tff7b72selfTff7b72.Td2a8ffHW_STATE_SLEEPTb4b4b4: Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATE_RINGING
Tff7b72selfTff7b72.Td2a8ffcaller Tff7b72= Te6edf3remote_identity
Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72= Ta5d6ff"Ta5d6fffromTa5d6ff" Tff7b72if Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72== Tff7b72None Tff7b72else Ta5d6ff"Ta5d6fftoTa5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffea00\nTa5d6ffIncoming call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHit enter to answer, Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffrTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ff to rejectTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Te6edf3hash_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3hash_str Tff7b72in Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4:
Te6edf3remote_alias Tff7b72= Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3hash_strTb4b4b4]
Te6edf3remote_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4[Te6edf3hash_strTb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Te6edf3remote_nameTb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3remote_aliasTffd700}Ta5d6ff)Ta5d6ff"Tff7b72.Td2a8ffrjustTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffCOLSTb4b4b4,Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Te6edf3hash_strTb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Te6edf3hash_strTb4b4b4[T79c0ff16Tb4b4b4:Tb4b4b4]Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffcall_endedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_in_call Tff7b72or Tff7b72selfTff7b72.Td2a8ffis_ringing Tff7b72or Tff7b72selfTff7b72.Td2a8ffcall_is_connectingTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_in_callTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCall with Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff endedTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_ringingTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCall Tffd700{Tff7b72selfTff7b72.Td2a8ffdirectionTffd700}Ta5d6ff Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff was not answeredTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcall_is_connectingTb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCall to Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff could not be connectedTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirection Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATE_AVAILABLE
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcall_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcall_is_connecting Tff7b72or Tff7b72selfTff7b72.Td2a8ffis_ringingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Tff7b72selfTff7b72.Td2a8ffSTATE_IN_CALL
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCall established with Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplay_call_statusTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdisplay_call_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3started Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3erase_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72while Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTATE_IN_CALLTb4b4b4:
Te6edf3elapsed Tff7b72= Tffa657roundTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3startedTb4b4b4)
Te6edf3time_string Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3elapsedTb4b4b4)
Te6edf3stat_string Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffIn call for Tffd700{Te6edf3time_stringTffd700}Ta5d6ff, hit enter to hang up Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTffd700{Te6edf3stat_stringTffd700}Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3erase_string Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3stat_stringTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTffd700{Te6edf3erase_strTffd700}Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6ffCall connectedTa5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3time_stringTffd700}Ta5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.00Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\rTffd700{Te6edf3erase_strTffd700}Ta5d6ff> Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffbecame_availableTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_available Tff7b72and Tff7b72selfTff7b72.Td2a8fffirst_runTb4b4b4:
Te6edf3hs Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6fffirst_promptTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3hs Tff7b72= Ta5d6ff"Ta5d6ff (or ? for help)Ta5d6ff"Tb4b4b4; Tff7b72selfTff7b72.Td2a8fffirst_prompt Tff7b72= Tff7b72True
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnter identity hash and hit enter to callTffd700{Te6edf3hsTffd700}Tffea00\nTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff> Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6ffTelephone ReadyTa5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplay Tff7b72or Tff7b72selfTff7b72.Td2a8ffkeypadTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_last_event Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tff7b72def Td2a8ffprint_identityTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argsTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash of this telephone: Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffprint_destinationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argsTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDestination hash of this telephone: Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffphonebook_menuTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo entries in phonebookTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72def Td2a8ffexit_menuTb4b4b4(Te6edf3argsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPhonebook closedTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmain_menuTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdial_factoryTb4b4b4(Te6edf3identity_hashTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffxTb4b4b4(Te6edf3argsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdialTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72return Te6edf3x
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3TerminalTff7b72.Td2a8ffUNDERLINETffd700}Ta5d6ffPhonebookTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_menu Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3maxaliaslen Tff7b72= T79c0ff0
Tff7b72for Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4: Te6edf3maxaliaslen Tff7b72= Tffa657maxTb4b4b4(Te6edf3maxaliaslenTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3identity_hashTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3maxlen Tff7b72= T79c0ff0Tb4b4b4; Te6edf3maxnlen Tff7b72= Tffa657maxTb4b4b4(Te6edf3maxaliaslenTb4b4b4, Tffa657lenTb4b4b4(Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3n Tff7b72= T79c0ff0
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4: Te6edf3maxlen Tff7b72= Tffa657maxTb4b4b4(Te6edf3maxlenTb4b4b4, Tffa657lenTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4:
Te6edf3n Tff7b72+Tff7b72= T79c0ff1Tb4b4b4; Te6edf3identity_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffphonebookTb4b4b4[Te6edf3nameTb4b4b4]
Te6edf3alias Tff7b72= Te6edf3n
Tff7b72if Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4:
Te6edf3alias Tff7b72= Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Te6edf3spaces Tff7b72= Te6edf3maxlenTff7b72-Tffa657lenTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4; Te6edf3nspaces Tff7b72= Te6edf3maxnlenTff7b72-Tffa657lenTb4b4b4(Tffa657strTb4b4b4(Te6edf3aliasTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3s Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Tffd700{Te6edf3sTff7b72*Te6edf3nspacesTffd700}Tffd700{Te6edf3aliasTffd700}Tffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Tffd700{Te6edf3sTff7b72*Te6edf3spacesTffd700}Ta5d6ff : <Tffd700{Te6edf3identity_hashTffd700}Ta5d6ff>Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Ta5d6fffTa5d6ff"Tffd700{Te6edf3aliasTffd700}Ta5d6ff"Tb4b4b4] Tff7b72= Te6edf3dial_factoryTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffbTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffackTffd700{Te6edf3sTff7b72*Tb4b4b4(Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3maxlenTff7b72+Te6edf3maxnlenTff7b72-T79c0ff2Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff: Back to main menuTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3exit_menu
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Ta5d6ff"Ta5d6ffbackTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3exit_menu
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3exit_menu
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Ta5d6ff"Ta5d6ffquitTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3exit_menu
Tff7b72def Td2a8ffmain_menuTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3argsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffm_helpTb4b4b4(Te6edf3argvTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3TerminalTff7b72.Td2a8ffUNDERLINETffd700}Ta5d6ffAvailable commandsTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffpTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffhonebook : Open the phonebookTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffrTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffedial : Call the last called identity againTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffiTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffdentity : Display the identity hash of this telephoneTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffdTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffesthash : Display the destination hash of this telephoneTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffaTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffnnounce : Send an announce from this telephoneTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffqTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffuit : Exit the programTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffhTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ffelp : This help menuTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffm_quitTb4b4b4(Te6edf3argvTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffquitTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffm_announceTb4b4b4(Te6edf3argvTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAnnounce sentTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffactive_menu Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffhelpTa5d6ff"Tb4b4b4: Te6edf3m_helpTb4b4b4,
Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4: Te6edf3m_helpTb4b4b4,
Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4: Te6edf3m_helpTb4b4b4,
Ta5d6ff"Ta5d6ffpTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffphonebook_menuTb4b4b4,
Ta5d6ff"Ta5d6ffphonebookTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffphonebook_menuTb4b4b4,
Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffredialTb4b4b4,
Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprint_identityTb4b4b4,
Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprint_identityTb4b4b4,
Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprint_destinationTb4b4b4,
Ta5d6ff"Ta5d6ffdesthashTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffprint_destinationTb4b4b4,
Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4: Te6edf3m_announceTb4b4b4,
Ta5d6ff"Ta5d6ffanounceTa5d6ff"Tb4b4b4: Te6edf3m_announceTb4b4b4,
Ta5d6ff"Ta5d6ffredialTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffredialTb4b4b4,
Ta5d6ff"Ta5d6ffexitTa5d6ff"Tb4b4b4: Te6edf3m_quitTb4b4b4,
Ta5d6ff"Ta5d6ffquitTa5d6ff"Tb4b4b4: Te6edf3m_quitTb4b4b4,
Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4: Te6edf3m_quitTb4b4b4}
Tff7b72def Td2a8ffrunTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReticulum Telephone Service is readyTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash: Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3TerminalTff7b72.Td2a8ffBOLDTffd700}Ta5d6ffReticulum Telephone Utility is readyTffd700{Te6edf3TerminalTff7b72.Td2a8ffENDTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Identity hash: Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffserviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_availableTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflast_input Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_inputTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_availableTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdialTb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_inputTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid identity hash: Tffd700{Te6edf3eTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8fflast_input Tff7b72and Tff7b72selfTff7b72.Td2a8fflast_inputTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffactive_menuTb4b4b4[Tff7b72selfTff7b72.Td2a8fflast_inputTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4]Tb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_inputTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffis_ringingTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflast_input Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAnswering call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffanswerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not answer call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRejecting call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffis_in_call Tff7b72or Tff7b72selfTff7b72.Td2a8ffcall_is_connectingTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHanging up call with Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_input Tff7b72= Tffa657inputTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffcleanupTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffkeypadTb4b4b4: Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffquitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcleanupTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ff__spinTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3untilTff7b72=Tff7b72NoneTb4b4b4, Te6edf3msgTff7b72=Tff7b72NoneTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tffa657printTb4b4b4(Te6edf3msgTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72while Tb4b4b4(Te6edf3timeout Tff7b72== Tff7b72None Tff7b72or Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72<Te6edf3timeoutTb4b4b4) Tff7b72and Tff7b72not Te6edf3untilTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3msgTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72None Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3timeoutTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72def Td2a8ff_display_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_available Tff7b72and Tff7b72selfTff7b72.Td2a8ffhw_is_idle Tff7b72and Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffbusyTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3now Tff7b72- Tff7b72selfTff7b72.Td2a8ffhw_last_event Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_SLEEP_TIMEOUTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_SLEEP
Tff7b72selfTff7b72.Td2a8ff_sleep_displayTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff_sleep_displayTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffsleepTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_wake_displayTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffwakeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_update_displayTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisplayTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhw_is_dialingTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhw_inputTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Te6edf3lookup_name Tff7b72= Ta5d6ff"Ta5d6ffEnter numberTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3lookup_name Tff7b72= Ta5d6ff"Ta5d6ffUnknownTa5d6ff"
Tff7b72for Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4:
Te6edf3alias Tff7b72= Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72== Te6edf3aliasTb4b4b4: Te6edf3lookup_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnamesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffhw_inputTffd700}Ta5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdisplayTff7b72.Td2a8ffprintTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3lookup_nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3xTff7b72=T79c0ff0Tb4b4b4, Te6edf3yTff7b72=T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff_keypad_eventTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keypadTb4b4b4, Te6edf3eventTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_last_event Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72== Tff7b72selfTff7b72.Td2a8ffHW_STATE_SLEEPTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tff7b72selfTff7b72.Td2a8ff_wake_displayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_ringingTb4b4b4:
Te6edf3answer_events Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffDTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWN
Te6edf3answer_events Tff7b72|Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffhookTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffUP
Tff7b72if Te6edf3answer_eventsTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAnswering call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffanswerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not answer call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffCTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWNTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRejecting call from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffis_in_call Tff7b72or Tff7b72selfTff7b72.Td2a8ffcall_is_connectingTb4b4b4:
Te6edf3hangup_events Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffDTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWN
Te6edf3hangup_events Tff7b72|Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffhookTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWN
Tff7b72if Te6edf3hangup_eventsTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffHanging up call with Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcallerTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffhangupTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffis_available Tff7b72and Tff7b72selfTff7b72.Td2a8ffhw_is_idleTb4b4b4:
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffATa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWNTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4; Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_DIAL
Tff7b72selfTff7b72.Td2a8ff_update_displayTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffKPD_NUMBERS Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWNTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72+Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4; Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_DIAL
Tff7b72selfTff7b72.Td2a8ff_update_displayTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffis_available Tff7b72and Tff7b72selfTff7b72.Td2a8ffhw_is_dialingTb4b4b4:
Te6edf3dial_event Tff7b72= Tff7b72False
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffDOWNTb4b4b4:
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72in Tff7b72selfTff7b72.Td2a8ffKPD_NUMBERSTb4b4b4: Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72+Tff7b72= Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffATa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffbecame_availableTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffBTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Tff7b72selfTff7b72.Td2a8ffhw_inputTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffCTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffDTa5d6ff"Tb4b4b4: Te6edf3dial_event Tff7b72= Tff7b72True
Tff7b72if Te6edf3eventTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffhookTa5d6ff" Tff7b72and Te6edf3eventTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffkeypadTff7b72.Td2a8ffecTff7b72.Td2a8ffUPTb4b4b4: Te6edf3dial_event Tff7b72= Tff7b72True
Tff7b72if Te6edf3dial_eventTb4b4b4:
Tff7b72for Te6edf3identity_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4:
Te6edf3alias Tff7b72= Tff7b72selfTff7b72.Td2a8ffaliasesTb4b4b4[Te6edf3identity_hashTb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72== Te6edf3aliasTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhw_input Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffhw_state Tff7b72= Tff7b72selfTff7b72.Td2a8ffHW_STATE_IDLE
Tff7b72selfTff7b72.Td2a8ffdialTb4b4b4(Te6edf3identity_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_update_displayTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsigint_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3signalTb4b4b4, Te6edf3frameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcleanupTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffsigterm_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3signalTb4b4b4, Te6edf3frameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcleanupTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Telephone UtilityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-lTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--list-devicesTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fflist available audio devicesTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--rnsconfigTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--serviceTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrun as a serviceTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--systemdTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdisplay example systemd unitTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnphone Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8fflist_devicesTb4b4b4:
Tff7b72import T7ee787LXST
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff0
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffAvailable audio devices:Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3device Tff7b72in Te6edf3LXSTTff7b72.Td2a8ffSourcesTff7b72.Td2a8ffBackendTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_speakersTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Output : Tffd700{Te6edf3deviceTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3device Tff7b72in Te6edf3LXSTTff7b72.Td2a8ffSinksTff7b72.Td2a8ffBackendTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsoundcardTff7b72.Td2a8ffall_microphonesTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Input : Tffd700{Te6edf3deviceTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffsystemdTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTo install rnphone as a system service, paste theTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffsystemd unit configuration below into a new file at:Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff/etc/systemd/system/rnphone.serviceTffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThen enable the service at boot by running:Tffea00\nTffea00\nTa5d6ffsudo systemctl enable rnphoneTffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff--- begin systemd unit snipped ---Tffea00\nTa5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Te6edf3__systemd_unit__Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ffUSERNAMETa5d6ff"Tb4b4b4, Te6edf3osTff7b72.Td2a8ffgetloginTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff--- end systemd unit snipped ---Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3ReticulumTelephoneTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3rnsconfigdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffrnsconfigTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3service Tff7b72= Te6edf3argsTff7b72.Td2a8ffserviceTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tff7b72if Te6edf3appTb4b4b4: Te6edf3appTff7b72.Td2a8ffquitTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Te6edf3__default_rnphone_config__ Tff7b72= Ta5d6ff"""Ta5d6ff# This is an example rnphone config file.
Ta5d6ff# You should probably edit it to suit your
Ta5d6ff# intended usage.
Ta5d6ff[telephone]
Ta5d6ff # You can define the ringtone played when the
Ta5d6ff # phone is ringing. Must be in OPUS format, and
Ta5d6ff # located in the rnphone config directory.
Ta5d6ff
Ta5d6ff ringtone = ringer.opus
Ta5d6ff # You can define the preferred audio devices
Ta5d6ff # to use as the speaker output, ringer output
Ta5d6ff # and microphone input. The names do not have
Ta5d6ff # to be an exact match to your full soundcard
Ta5d6ff # device name, but will be fuzzy matched.
Ta5d6ff # You can list available device names with:
Ta5d6ff # rnphone -l
Ta5d6ff
Ta5d6ff # speaker = device name
Ta5d6ff # microphone = device name
Ta5d6ff # ringer = device name
Ta5d6ff # You can configure who is allowed to call
Ta5d6ff # this telephone. This can be set to either
Ta5d6ff # Ta5d6ff"Ta5d6ffallTa5d6ff"Ta5d6ff, Ta5d6ff"Ta5d6ffnoneTa5d6ff"Ta5d6ff, Ta5d6ff"Ta5d6ffphonebookTa5d6ff"Ta5d6ff or a list of
Ta5d6ff # identity hashes. See examples below.
Ta5d6ff # allowed_callers = all
Ta5d6ff # allowed_callers = none
Ta5d6ff # allowed_callers = phonebook
Ta5d6ff # allowed_callers = b8d80b1b7a9d3147880b366995422a45, fcfb80d4cd3aab7c8710541fb2317974
Ta5d6ff # It is also possible to block specific
Ta5d6ff # callers on a per-identity basis.
Ta5d6ff # blocked_callers = f3e8c3359b39d36f3baff0a616a73d3e, 5d2d14619dfa0ff06278c17347c14331
Ta5d6ff[phonebook]
Ta5d6ff # You can add entries to the phonebook for
Ta5d6ff # quick dialling by adding them here
Ta5d6ff # Mary = f3e8c3359b39d36f3baff0a616a73d3e
Ta5d6ff # Jake = b8d80b1b7a9d3147880b366995422a45
Ta5d6ff # Dean = 05d4c6697bb38e5458a3077571157bfa
Ta5d6ff # You can optionally specify a numerical
Ta5d6ff # alias for calling with a physical keypad
Ta5d6ff # Rudy = 5d2d14619dfa0ff06278c17347c14331, 241
Ta5d6ff # Josh = fcfb80d4cd3aab7c8710541fb2317974, 7907
Ta5d6ff[hardware]
Ta5d6ff # If the required hardware is connected, and
Ta5d6ff # the neccessary modules installed, you can
Ta5d6ff # enable various hardware components.
Ta5d6ff
Ta5d6ff # keypad = gpio_4x4
Ta5d6ff # display = i2c_lcd1602
Ta5d6ff # If you have a keypad connected, you can
Ta5d6ff # also enable a GPIO pin for detecting
Ta5d6ff # on-hook/off-hook status
Ta5d6ff # keypad_hook_pin = 5
Ta5d6ff # You can configure a pin for muting the
Ta5d6ff # ringer amplifier, if available
Ta5d6ff # amp_mute_pin = 25
Ta5d6ff # amp_mute_level = high
Ta5d6ff"""
Te6edf3__systemd_unit__ Tff7b72= Ta5d6ff"""Ta5d6ff# This systemd unit allows installing rnphone
Ta5d6ff# as a system service on Linux-based devices
Ta5d6ff[Unit]
Ta5d6ffDescription=Reticulum Telephone Service
Ta5d6ffAfter=sound.target
Ta5d6ff[Service]
Ta5d6ff# Wait 30 seconds for WiFi and audio
Ta5d6ff# hardware to initialise.
Ta5d6ffExecStartPre=/bin/sleep 30
Ta5d6ffType=simple
Ta5d6ffEnvironment=Ta5d6ff"Ta5d6ffDISPLAY=:0Ta5d6ff"
Ta5d6ffEnvironment=Ta5d6ff"Ta5d6ffXAUTHORITY=/home/USERNAME/.XauthorityTa5d6ff"
Ta5d6ffEnvironment=Ta5d6ff"Ta5d6ffXDG_RUNTIME_DIR=/run/user/1000Ta5d6ff"
Ta5d6ffRestart=always
Ta5d6ffRestartSec=5
Ta5d6ffUser=USERNAME
Ta5d6ffExecStart=/home/USERNAME/.local/bin/rnphone --service -vvv
Ta5d6ff[Install]
Ta5d6ffWantedBy=graphical.target
Ta5d6ff"""
Tff7b72class T56d364TerminalTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3UNDERLINE Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[4mTa5d6ff"
Te6edf3BOLD Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[1mTa5d6ff"
Te6edf3END Tff7b72= Ta5d6ff"Tffea00\033Ta5d6ff[0mTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3UNDERLINE Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3BOLD Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3END Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────